package org.example.aop;


import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class AopAspect {
    //@Aspect 注解是切面，
    //@Pointcut 切点
    //execution(* org.example.service.UserService.*(..) ) 所有的连接点构成了切点
    //切点有了后，我们就有通知帮我们执行函数。@Before
    @Pointcut("execution(* org.example.service.UserService.*(..) )")
    public void pointcut(){
    }

    //execution()切入点 @Before 前置通知

    @Before("pointcut()")
    public void doSomething(){
        System.out.println("=== 前置通知函数执行 ===");
    }

    @After("pointcut()")
    public void doAfter() {
        System.out.println("=== 后置通知函数执行 ===");
    }

    @AfterThrowing("pointcut()")
    public void throwing(){
        System.out.println("=== 手动抛出异常后 AOP通知 ===");
    }

    @Around("pointcut()")
    public void around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("=== 方法函数执行前环绕通知 ===");
        joinPoint.proceed();
        System.out.println(joinPoint);
        System.out.println("=== 方法函数执行后环绕通知 ===");
    }


}
